/**
 * High Resolution Time API
 * 本规格定义了一个 API，该 API 可以提供毫秒级的原始时间、当前时间，且不受系统时钟的影响。
 * ECMAScript 标准定义了日期对象 Date，用于毫秒级别的精确时间点描述，
 * 但 Date 定义的时间值，在实践中会受系统时钟偏移和调节器的影响导致不能单调递增，而出现bug。
 * 
 * High Resolution Time API 不建议修改 Date 的行为，因为 Date 已经深入使用很长一段时间了。
 * 该 API 定义了一个新的 Performance 接口，提供了一个保证可以单调递增的时间模型（DOMHighResTimeStamp）
 * 并提供了 now 和 timeOrigin 静态方法。
 * 下面是一个实例：
 */

let oSendBtn = document.querySelector('#sendToWorker');

/**
 * High Resolution Time API 支持在 web worker 中执行，获取当前作用域创建到代码执行时的时间戳
 */
// 记录窗口对象开始时间
console.log(`窗口开始时间：${performance.timeOrigin}`);
// 记录任务时序的开始
let task_start = performance.now();
console.log(`主线程任务开始时间：${task_start}`);

// 耗时任务
for(let i = 0; i < 1000000; i += 1) {};
let worker = new Worker('/javascripts/webapi/highResolutionTime/worker.js');
worker.onmessage = (event) => {
  // 当 worker 执行时的开始时间与主线程文档的开始时间不同，
  let msg = event.data;
  // 将新的时间戳转换成文档的时间戳
  msg.start_time = msg.start_time - performance.timeOrigin;
  msg.end_time = msg.end_time - performance.timeOrigin;
  console.log(`worker 时序：${msg.start_time}, ${msg.end_time}`);
}

// 记录任务时序的结束
let task_end = performance.now();
console.log(`主线程任务结束时间：${task_end}`);

oSendBtn.addEventListener('click', () => {
  worker.postMessage('asdf');
})

/**
 * 上面是 Performace 接口在主线程和工作线程中使用的示例，涉及到一些 High Resolution Time API 定义的新数据结构
 * Time Origin：是一个经过以下推论得出的时间值：
 *    1：如果全局对象是 window 对象的话，timeOrigin 必须等于：
 *        a: 如果没有前置文档，那就是当前浏览器上下文创建的时间
 *        b: 如果上一个页面还存在，并且确认对话框显示过，那么就是用户确认导航的时间
 *        c: 否则就是开始导航到负责加载 window 对象的最新的 document 对象的时间。
 *    2. 如果全局对象是 WorkerGlobalScope 对象，那么 timeOrigin 就是工作线程创建的时间。
 *    3. 否则是 undefined（Node）
 */